// type BuiltInType<T> =
//   | StringConstructor
//   | NumberConstructor
//   | BooleanConstructor
//   | T;

// type NormalizeType<T> = T extends StringConstructor
//   ? string
//   : T extends NumberConstructor
//   ? number
//   : T extends BooleanConstructor
//   ? boolean
//   : T;

// type ReflexType<T> = {
//   [key in keyof T]: T[key] extends { type: infer TYPE; required: true }
//     ? NormalizeType<TYPE>
//     : T[key] extends { type: infer TYPE }
//     ? NormalizeType<TYPE> | undefined
//     : NormalizeType<T[key]> | undefined
// };

// type DefaultType<T> = {
//   [key: string]: { type?: BuiltInType<T>; require?: boolean } | BuiltInType<T>;
// };

// function createComponent<T extends DefaultType<any>> (props: {
//   props: T;
//   setup(props: ReflexType<T>): any;
// }) {}

// createComponent({
//   props: {
//     foo: {

//     },
//     bar: {
//       type: Number
//     },
//     boo: Boolean,
//     options: (null as any) as { msg: string },
//     requiredOptions: {
//       type: (null as any) as { msg: string },
//       required: true
//     }
//   } as const,
//   setup (props) {
//     props.foo
//     props.bar
//     props.boo
//     props.options
//     props.requiredOptions
//   }
// })
